package com.borened.common.core.util;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.borened.common.core.constant.SecurityConstants;
import com.borened.common.core.exception.TokenParseException;

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * web servlet环境中 jwt工具类
 * <p>
 * 用于解析从网关转发过来的请求携带的JWT载荷信息payload,从servlet request上下文获取必要的用户参数.
 * 请注意在异步任务的子线程中使用该工具类会丢失相关信息或报错,应该使用{@link com.borened.common.boot.security.SecurityJwtUtils}。
 * 该工具类不解析并校验token，无法保证请求来源的安全性。
 * </p>
 *
 * @author: cch
 * @since: 2021/11/3
 * @see com.borened.common.boot.security.SecurityJwtUtils
 */
public class JwtUtils {

    /**
     * 获取JWT 载荷信息
     *
     * @return
     */

    public static JSONObject getJwtPayload() {
        JSONObject jsonObject = null;
        try {
            //从当前request中获取
            String payload =
                    RequestUtils.getRequest().getHeader(SecurityConstants.JWT_PAYLOAD_KEY);
            jsonObject = JSONUtil.parseObj(URLDecoder.decode(payload, StandardCharsets.UTF_8.name()));
        } catch (Exception e) {
            throw new TokenParseException("token解析异常！");
        }
        return jsonObject;
    }

    /**
     * 解析JWT获取用户ID
     *
     * @return
     */
    public static Long getUserId() {
        Long id = getJwtPayload().getLong(SecurityConstants.JWT_USER_ID_KEY);
        return id;
    }

    /**
     * 解析JWT获取获取用户名
     *
     * @return
     */
    public static String getUsername() {
        String username = getJwtPayload().getStr(SecurityConstants.JWT_USER_NAME_KEY);
        return username;
    }


    /**
     * JWT获取用户角色列表
     *
     * @return 角色列表
     */
    public static Set<String> getRoles() {
        List<String> roles = null;
        JSONObject payload = getJwtPayload();
        if (payload.containsKey(SecurityConstants.JWT_AUTHORITIES_KEY)) {
            roles = payload.getJSONArray(SecurityConstants.JWT_AUTHORITIES_KEY).toList(String.class);
        }
        return new HashSet<>(roles);
    }

    /**
     * 获取第一个可用的角色标识
     *
     * @return
     */
    public static String getRole() {
        Set<String> roles = getRoles();
        Iterator<String> iterator = roles.iterator();
        if (iterator.hasNext()) {
            return iterator.next();
        }
        return null;
    }

    /**
     * 从jwt中获取已认证的客户端标识
     *
     * @return
     */
    public static String getClientId() {
        String clientId = getJwtPayload().getStr(SecurityConstants.JWT_CLIENT_ID_KEY);
        return clientId;
    }

    /**
     * 从jwt中获取应用标识
     *
     * @return
     */
    public static Integer getAppId() {
        Integer appId = getJwtPayload().getInt(SecurityConstants.JWT_APPLICATION_ID_KEY);
        return appId;
    }

    /**
     * 从jwt中获取当前用户所在部门编码
     *
     * @return
     */
    public static Long getDeptId() {
        return getJwtPayload().getLong(SecurityConstants.JWT_DEPT_ID_KEY);
    }

    /**
     * 从jwt中获取当前行政编码
     *
     * @return
     */
    public static Long getRegionCode() {
        return getJwtPayload().getLong(SecurityConstants.JWT_REGION_CODE_KEY);
    }

    /**
     * 从jwt中获取openid
     *
     * @return
     */
    public static String getOpenid() {
        String openid = getJwtPayload().getStr(SecurityConstants.JWT_OPENID_KEY);
        return openid;
    }
}
